﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows.Forms;
using Business;
using Business.Entity.Vendas.Pedido.ClassesRelacionadas;
using Business.Forms;

namespace Vendas.Forms
{
    public partial class FormPagamentoPedido : FormDefault
    {
        public decimal ValorPedido { get; set; }
        public decimal Total { get; set; }
        public FormPagamentoPedido(Decimal valorPedido, IList<FormaPagamento> formas,
            IList<CondicaoPagamento> condicoes
            )
        {
            InitializeComponent();
            formaPagamentoBindingSource.DataSource = formas;
            condicaoPagamentoBindingSource.DataSource = condicoes;
            pagamentoPedidoBindingSource.DataSource = new List<PagamentoPedido>();
            ValorPedido = valorPedido;
            //condicaoPagamentoGridLookUpEdit.RefreshEditValue();
            condicaoPagamentoGridLookUpEdit.Refresh();
            CalcularPedido();
        }

        private void CalcularPedido()
        {
            try
            {
                Total = ValorPedido + acressimosSpinEdit.Value - GetDesconto();
                valorPedidoTextEdit.Value = ValorPedido;
                acressimosTextEdit.Value = GetAcressimos();
                descontosTextEdit.Value = GetDesconto();
                freteTextEdit.Value = GetFrete();
                subtotalTextEdit.Value = Total;
            }
            catch (Exception)
            {

            }

        }

        private void FormPagamentoPedido_KeyUp(object sender, KeyEventArgs e)
        {

        }

        /// <summary>
        /// Método que obtém os acressimos de um pedido.
        /// </summary>
        /// <returns></returns>
        public decimal GetAcressimos()
        {
            return acressimosSpinEdit.Value;
        }
        /// <summary>
        /// Método que pega o valor do desconto em moeda corrente.
        /// </summary>
        /// <returns></returns>
        public Decimal GetDesconto()
        {
            Decimal desc = 0;
            if (descontoMonetarioSpinEdit.Value != 0)
            {
                desc = descontoMonetarioSpinEdit.Value;
            }
            if (descontoPercentualSpinEdit.Value != 0)
            {
                desc = ValorPedido * descontoPercentualSpinEdit.Value / 100;
            }

            return desc;
        }
        public IList<PagamentoPedido> GetPagamentoPedido()
        {
            pagamentoPedidoBindingSource.EndEdit();
            var ret = (IList<PagamentoPedido>)pagamentoPedidoBindingSource.DataSource;
            foreach (var pag in ret)
            {
                pag.ValorTotal = pag.Valor + pag.Juros - pag.Desconto;
            }
            return ret;
        }

        public CondicaoPagamento GetCondicaoPagamento()
        {
            formaPagamentoBindingSource.EndEdit();
            condicaoPagamentoBindingSource.EndEdit();
            return (CondicaoPagamento)condicaoPagamentoGridLookUpEdit.EditValue;
        }

        private void GeraParcelas()
        {
            var c = GetCondicaoPagamento();
            if (c == null) return;

            Calendar calendar = CultureInfo.InvariantCulture.Calendar;

            var valorParcela = ValorPedido / c.Parcelas;
            foreach (var prazo in c.Prazos)
            {
                var f = new PagamentoPedido();
                // Caso não haja parcela na lista pega a forma de pagamento padrão.
                if (formaPagamentoBindingSource.Count == 0)
                {
                    f.FormaPagamento = Utils.Configuracao.FormaPagamentoPadrao;
                }
                f.Valor = valorParcela;
                f.Vencimento = calendar.AddDays(DateTime.Now, prazo.Prazo);
                pagamentoPedidoBindingSource.Add(f);
            }
        }

        private void LimpaParcelas()
        {
            pagamentoPedidoBindingSource.EndEdit();
            pagamentoPedidoBindingSource.Clear();
        }

        private void condicaoPagamentoGridLookUpEdit_EditValueChanged(object sender, EventArgs e)
        {
            LimpaParcelas();
            GeraParcelas();
        }

        private void FormPagamentoPedido_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyData)
            {
                case Keys.F5:
                    pagamentoPedidoBindingSource.EndEdit();
                    if (ValidaParcelas())
                    {
                        DialogResult = DialogResult.OK;
                        Close();
                    }
                    break;
                case Keys.F6:
                    condicaoPagamentoGridLookUpEdit.Focus();
                    break;
                case Keys.F7:
                    descontoMonetarioSpinEdit.Value = 0;
                    descontoPercentualSpinEdit.Value = 0;
                    descontoMonetarioSpinEdit.SelectAll();
                    descontoMonetarioSpinEdit.Focus();
                    break;
                case Keys.F8:
                    descontoPercentualSpinEdit.Value = 0;
                    descontoMonetarioSpinEdit.Value = 0;
                    descontoPercentualSpinEdit.SelectAll();
                    descontoPercentualSpinEdit.Focus();
                    break;
                case Keys.Escape:
                    DialogResult = DialogResult.Cancel;
                    Close();
                    break;
            }
        }

        private bool ValidaParcelas()
        {

            for (int i = 0; i < pagamentoPedidoBindingSource.Count; i++)
            {
                var pag = (PagamentoPedido)pagamentoPedidoBindingSource[i];
                if (pag.Valor <= 0 || pag.FormaPagamento == null)
                {
                    MessageBox.Show("A parcela '" + (i + 1) + " não foi informada corretamente.\n" +
                                    "Verifique e tente novamente.");
                    return false;
                }

            }
            return true;
        }

        public decimal GetFrete()
        {
            return freteSpinEdit.Value;
        }

        private void descontoMonetarioSpinEdit_EditValueChanged(object sender, EventArgs e)
        {
            CalcularPedido();
        }

        private void descontoPercentualSpinEdit_EditValueChanged(object sender, EventArgs e)
        {
            CalcularPedido();
        }
    }
}